<?php
/**
 * CreateTime: 2023/12/5 13:59
 * User:LinQ
 */

namespace App\Func\File;

use App\Facade\UserFuncFacade;
use App\Models\Files\FilesModel;
use App\Models\Users\UsersModel;
use Illuminate\Support\Facades\Storage;

class FileFunc
{
    /**
     * 插入文件数据，同时对文件进行校验，自动规避掉同一公司下，对hash值相同的文件的重复上传
     * @param $ownerId integer 创建人id
     * @param $fileName string 文件名
     * @param $fileHash string 文件hash值
     * @param $filePath string 文件路径
     */
    public function insertFileData($ownerId,$fileName,$fileHash,$filePath){
        // 获取当前创建人的公司
        $userInfo = UsersModel::find($ownerId);
        $comId = $userInfo['com_id'];
        $fileModel = (new FilesModel());
        $fileInfo = $fileModel
            ->where('owner_id',$ownerId)
            ->where('com_id',$comId)
            ->where('file_hash',$fileHash)
            ->first();
        if($fileInfo){
            s_fail_return([
                'file_id' => $fileInfo['file_id'],
                'file_name'=> $fileInfo['file_name'],
                'file_path'=> $fileInfo['file_path'],
                'file_ext'=> pathinfo($fileName)['extension'] ?? "-"
            ],trans('message.is_exists',['name'=>trans('key.file')]));
        }

        return $fileModel->insertGetId([
            'file_name' => $fileName,
            'file_hash' => $fileHash,
            'file_path' => $filePath,
            'owner_id' => $ownerId,
            'com_id' => $comId,
            'created_at' => date('Y-m-d h:i:s'),
            'updated_at' => date('Y-m-d h:i:s'),
        ]);
    }

    /**
     * 插入文件数据，同时对文件进行校验，自动规避掉同一公司下，对hash值相同的文件的重复上传
     * @param $ownerId integer 创建人id
     * @param $fileName string 文件名
     * @param $fileHash string 文件hash值
     * @param $filePath string 文件路径
     */
    public function insertFileDataPid($ownerId,$fileName,$fileHash,$filePath,$pid){
        // 获取当前创建人的公司
        $userInfo = UsersModel::find($ownerId);
        $comId = $userInfo['com_id'];
        $fileModel = (new FilesModel());
        $fileInfo = $fileModel
            ->where('owner_id',$ownerId)
            ->where('com_id',$comId)
            ->where('file_hash',$fileHash)
            ->first();
        if($fileInfo){
            s_fail_return([
                'file_id' => $fileInfo['file_id'],
                'file_name'=> $fileInfo['file_name'],
                'file_path'=> $fileInfo['file_path'],
                'file_ext'=> pathinfo($fileName)['extension'] ?? "-"
            ],trans('message.is_exists',['name'=>trans('key.file')]));
        }

        return $fileModel->insertGetId([
            'file_name' => $fileName,
            'file_hash' => $fileHash,
            'file_path' => $filePath,
            'pid' => $pid,
            'owner_id' => $ownerId,
            'com_id' => $comId,
            'created_at' => date('Y-m-d h:i:s'),
            'updated_at' => date('Y-m-d h:i:s'),
        ]);
    }

    /**
     * 传入文件id获取文件的信息用于对客户端的返回
     * @param $fileId
     * @return mixed
     */
    public function getFileInfoByFileIdToWeb($fileId){
        if($fileId=='-1'){
            return [];
        }
        $fileModel = new FilesModel();
        $info =  $fileModel
            ->select([
                'file_name',
                'file_path',
                'file_id',
            ])
            ->scopeAddComIdWhere()
            ->where('file_id',$fileId)->first();
        if(!$info){
            return [];
        }
        $info['file_ext'] = pathinfo($info['file_name'], PATHINFO_EXTENSION);
        return $info;
    }

    public function getFileListByFileIdsToWeb($fileIds){
        $fmtFileIds = explode(',',$fileIds);
        $fileModel = new FilesModel();
        $list =  $fileModel
            ->select([
                'file_name',
                'file_path',
                'file_id',
            ])
            ->scopeAddComIdWhere()
            ->whereIn('file_id',$fmtFileIds)
            ->get()->toArray();
        foreach($list as $key=>$value){
            $list[$key]['file_ext'] = pathinfo($value['file_name'], PATHINFO_EXTENSION);
        }
        return $list;
    }

    /**
     * 生产缩略图并且存入数据库 并返回数据库id
     * @param $userId integer 用户id
     * @param $dir string 保存的文件地址
     * @param $imageTemp string 原始图片地址 一般是tmp
     * @param $pid integer 上级图片id
     * @param $pName string 上级文件名称
     * @param $pExt string 上级文件类型
     * @param $configKey string 调用的处理配置文件
     * @return false|void
     */
    public function compressImage(
        int $userId,
        string $dir,
        string $imageTemp,
        int    $pid,
        string $pName,
        string $pExt,
        string $configKey = 'default'
    ){

        list($imageTempWidth, $imageTempHeight, $imageTempType) = getimagesize($imageTemp);
        // 计算缩放后的宽度和高度
        $configInfo = config('cImage.'.$configKey);
        $scale = $configInfo['scale'];
        $newWidth = $imageTempWidth * $scale;
        $newHeight = $imageTempHeight * $scale;
        $newImageName = $pName."_thumbnail.".$pExt;
        $compressionLevel =$configInfo['png'];
        $encryptionFileUrl = "file".DIRECTORY_SEPARATOR.$dir.DIRECTORY_SEPARATOR.$newImageName;

        switch ($imageTempType) {
            case IMAGETYPE_JPEG:
                $source = imagecreatefromjpeg($imageTemp);
                // 创建目标图像资源
                $target = imagecreatetruecolor($newWidth, $newHeight);
                // 将原始图片缩放到目标图片
                imagecopyresampled($target, $source, 0, 0, 0, 0, $newWidth, $newHeight, $imageTempWidth, $imageTempWidth);
                imagejpeg($target,$dir.DIRECTORY_SEPARATOR.$encryptionFileUrl);
                return (new FileFunc())->insertFileDataPid(
                    $userId,
                    $newImageName,
                    hash_file('sha256',Storage::path($encryptionFileUrl)),
                    $encryptionFileUrl,
                    $pid
                );
            case IMAGETYPE_PNG:
                $source = imagecreatefrompng($imageTemp);
                // 创建目标图像资源
                $target = imagecreatetruecolor($newWidth, $newHeight);
                // 将原始图片缩放到目标图片
                imagecopyresampled($target, $source, 0, 0, 0, 0, $newWidth, $newHeight, $imageTempWidth, $imageTempWidth);
                imagepng($target,$dir.DIRECTORY_SEPARATOR.$encryptionFileUrl,$compressionLevel);
                return (new FileFunc())->insertFileDataPid(
                    $userId,
                    $newImageName,
                    hash_file('sha256',Storage::path($encryptionFileUrl)),
                    $encryptionFileUrl,
                    $pid
                );
            case IMAGETYPE_GIF:
                $source = imagecreatefromgif($imageTemp);
                // 创建目标图像资源
                $target = imagecreatetruecolor($newWidth, $newHeight);
                // 将原始图片缩放到目标图片
                imagecopyresampled($target, $source, 0, 0, 0, 0, $newWidth, $newHeight, $imageTempWidth, $imageTempWidth);
                imagegif($target,$dir.DIRECTORY_SEPARATOR.$encryptionFileUrl);
                return (new FileFunc())->insertFileDataPid(
                    $userId,
                    $newImageName,
                    hash_file('sha256',Storage::path($encryptionFileUrl)),
                    $encryptionFileUrl,
                    $pid
                );
            default:
                return false;
        }
    }

}
